// 此文件由 SquareLine Studio 生成
// SquareLine Studio 版本: SquareLine Studio 1.5.4
// LVGL 版本: 8.3.11
// 项目名称: First

#include "../ui.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../../lvgl/src/misc/lv_color.h"
#include "../../lvgl/lvgl.h"

// ============= 管理员管理界面组件全局变量声明 =============
// 管理员面板对象
lv_obj_t * ui_AdminPanel        = NULL;
// 用户列表对象
lv_obj_t * ui_UserList          = NULL;
// 添加用户按钮对象
lv_obj_t * ui_ButtonAddUser     = NULL;
// 删除用户按钮对象
lv_obj_t * ui_ButtonDeleteUser  = NULL;
// 刷新按钮对象
lv_obj_t * ui_ButtonRefresh     = NULL;
// 返回登录按钮对象
lv_obj_t * ui_ButtonBackToLogin = NULL;

// ============= 静态函数声明 =============
// 最终确认修改用户信息的回调函数
static void final_confirm_modify(lv_event_t * e);
// 删除消息框关闭事件回调函数
static void delete_mbox_event_cb(lv_event_t * e);
// 添加消息框关闭事件回调函数
static void add_mbox_event_cb(lv_event_t * e);
// 修改消息框关闭事件回调函数
static void modify_mbox_event_cb(lv_event_t * e);
// 按钮删除事件回调函数（用于释放内存）
static void btn_delete_event_cb(lv_event_t * e);

/*============= 中文字体样式初始化函数 ============*/
/**
 * @brief 初始化管理员界面中文字体样式
 * @return 返回指向字体样式的指针
 * @note 使用楷体字体，大小为22，粗体样式
 */
static lv_style_t * AdminFontStyleInit(void)
{
    // 创建字体信息结构体
    static lv_ft_info_t info;
    info.name   = "/usr/share/fonts/simkai.ttf";  // 楷体字体路径
    info.weight = 22;   // 字体大小
    info.style  = FT_FONT_STYLE_BOLD;  // 粗体样式
    info.mem    = NULL;  // 内存指针（NULL表示从文件系统加载）
    // 初始化字体，如果失败则记录错误
    if(!lv_ft_font_init(&info)) {
        LV_LOG_ERROR("create failed.");
    }

    // 使用新字体创建样式
    static lv_style_t style;
    lv_style_init(&style);  // 初始化样式
    lv_style_set_text_font(&style, info.font);  // 设置字体
    lv_style_set_text_align(&style, LV_TEXT_ALIGN_CENTER);  // 设置文本居中对齐
    return &style;
}

/**
 * @brief 使用 LVGL 内置字体创建样式
 * @param font 指向LVGL内置字体的指针
 * @return 返回指向字体样式的指针
 * @note 封装函数，用于创建使用内置字体的样式
 */
static lv_style_t * create_builtin_font_style(const lv_font_t * font)
{
    static lv_style_t style;
    lv_style_init(&style);  // 初始化样式
    lv_style_set_text_font(&style, font);  // 设置内置字体
    return &style;
}

// ============= 消息框关闭事件回调函数 =============
/**
 * @brief 删除消息框关闭事件回调函数
 * @param e 事件对象指针
 * @note 当消息框关闭时，删除关联的键盘对象，防止内存泄漏
 */
static void delete_mbox_event_cb(lv_event_t * e)
{
    lv_obj_t * mbox = lv_event_get_current_target(e);  // 获取消息框对象
    lv_obj_t * kb   = lv_obj_get_child(mbox, -1);      // 获取最后一个子对象（键盘）
    // 如果键盘对象存在且类型正确，则删除它
    if(kb && lv_obj_check_type(kb, &lv_keyboard_class)) {
        lv_obj_del(kb);  // 删除键盘对象
    }
}

/**
 * @brief 添加消息框关闭事件回调函数
 * @param e 事件对象指针
 * @note 当消息框关闭时，删除关联的键盘对象，防止内存泄漏
 */
static void add_mbox_event_cb(lv_event_t * e)
{
    lv_obj_t * mbox = lv_event_get_current_target(e);  // 获取消息框对象
    lv_obj_t * kb   = lv_obj_get_child(mbox, -1);      // 获取最后一个子对象（键盘）
    // 如果键盘对象存在且类型正确，则删除它
    if(kb && lv_obj_check_type(kb, &lv_keyboard_class)) {
        lv_obj_del(kb);  // 删除键盘对象
    }
}

/**
 * @brief 修改消息框关闭事件回调函数
 * @param e 事件对象指针
 * @note 当消息框关闭时，删除关联的键盘对象，防止内存泄漏
 */
static void modify_mbox_event_cb(lv_event_t * e)
{
    lv_obj_t * mbox = lv_event_get_current_target(e);  // 获取消息框对象
    lv_obj_t * kb   = lv_obj_get_child(mbox, -1);      // 获取最后一个子对象（键盘）
    // 如果键盘对象存在且类型正确，则删除它
    if(kb && lv_obj_check_type(kb, &lv_keyboard_class)) {
        lv_obj_del(kb);  // 删除键盘对象
    }
}

// ============= 辅助函数 =============
/**
 * @brief 检查用户名是否已存在（管理员界面专用）
 * @param username 要检查的用户名
 * @param filename 用户数据文件路径
 * @return 如果用户名存在返回true，否则返回false
 * @note 遍历用户数据文件，检查是否有相同的用户名
 */
static bool is_username_exists_admin(const char * username, const char * filename)
{
    // 以只读模式打开用户数据文件
    FILE * file = fopen(filename, "r");
    if(file == NULL) {
        return false;  // 文件打开失败，返回false
    }

    char line[256];           // 存储文件中的一行数据
    char file_username[50];   // 存储从文件读取的用户名
    char file_password[50];   // 存储从文件读取的密码
    int quota;                // 存储用户余额

    // 跳过标题行
    if(fgets(line, sizeof(line), file) == NULL) {
        fclose(file);
        return false;
    }

    // 逐行读取文件内容
    while(fgets(line, sizeof(line), file)) {
        // 解析每行数据：用户名 密码 余额
        if(sscanf(line, "%s %s %d", file_username, file_password, &quota) == 3) {
            // 比较用户名是否相同
            if(strcmp(username, file_username) == 0) {
                fclose(file);  // 关闭文件
                return true;   // 找到相同的用户名，返回true
            }
        }
    }

    fclose(file);   // 关闭文件
    return false;   // 没有找到相同的用户名，返回false
}

/**
 * @brief 获取用户信息的函数
 * @param username 要查询的用户名
 * @param password 用于存储密码的缓冲区
 * @param quota 用于存储余额的指针
 * @return 如果找到用户返回true，否则返回false
 * @note 从用户数据文件中查找指定用户的信息
 */
static bool get_user_info(const char * username, char * password, int * quota)
{
    // 以只读模式打开用户数据文件
    FILE * file = fopen("/jakl/img/UserData.txt", "r");
    if(file == NULL) {
        return false;  // 文件打开失败
    }

    char line[256];            // 存储文件中的一行数据
    char file_username[50];    // 存储从文件读取的用户名
    char file_password[50];    // 存储从文件读取的密码
    int file_quota;            // 存储用户余额

    // 跳过标题行
    if(fgets(line, sizeof(line), file) == NULL) {
        fclose(file);
        return false;
    }

    // 逐行读取文件内容
    while(fgets(line, sizeof(line), file)) {
        // 解析每行数据：用户名 密码 余额
        if(sscanf(line, "%s %s %d", file_username, file_password, &file_quota) == 3) {
            // 比较用户名是否相同
            if(strcmp(username, file_username) == 0) {
                strcpy(password, file_password);  // 复制密码
                *quota = file_quota;              // 设置余额
                fclose(file);                     // 关闭文件
                return true;                      // 找到用户，返回true
            }
        }
    }

    fclose(file);   // 关闭文件
    return false;   // 没有找到用户，返回false
}

/**
 * @brief 更新用户信息的函数
 * @param username 要更新的用户名
 * @param new_password 新密码
 * @param new_quota 新余额
 * @return 如果更新成功返回true，否则返回false
 * @note 通过创建临时文件来更新用户信息，确保数据安全
 */
static bool update_user_info(const char * username, const char * new_password, int new_quota)
{
    // 打开原文件和临时文件
    FILE * file      = fopen("/jakl/img/UserData.txt", "r");        // 以只读模式打开原文件
    FILE * temp_file = fopen("/jakl/img/UserData_temp.txt", "w");   // 以写入模式创建临时文件

    // 检查文件是否打开成功
    if(file == NULL || temp_file == NULL) {
        if(file) fclose(file);           // 关闭原文件
        if(temp_file) fclose(temp_file); // 关闭临时文件
        return false;                    // 文件打开失败
    }

    char buffer[256];      // 存储文件中的一行数据
    bool user_found = false;  // 标记是否找到要更新的用户

    // 复制标题行到临时文件
    if(fgets(buffer, sizeof(buffer), file) != NULL) {
        fputs(buffer, temp_file);
    }

    // 处理每一行数据
    while(fgets(buffer, sizeof(buffer), file)) {
        char file_username[50], file_password[50];
        int file_quota;

        // 解析每行数据：用户名 密码 余额
        if(sscanf(buffer, "%s %s %d", file_username, file_password, &file_quota) == 3) {
            // 如果是要更新的用户
            if(strcmp(username, file_username) == 0) {
                // 写入更新后的用户信息
                fprintf(temp_file, "%s %s %d\n", username, new_password, new_quota);
                user_found = true;  // 标记已找到用户
            } else {
                // 复制其他用户信息到临时文件
                fputs(buffer, temp_file);
            }
        } else {
            // 复制注释或空行到临时文件
            fputs(buffer, temp_file);
        }
    }

    fclose(file);      // 关闭原文件
    fclose(temp_file); // 关闭临时文件

    // 如果找到要更新的用户
    if(user_found) {
        // 删除原文件
        remove("/jakl/img/UserData.txt");
        // 将临时文件重命名为原文件
        rename("/jakl/img/UserData_temp.txt", "/jakl/img/UserData.txt");
        return true;  // 更新成功
    } else {
        // 没有找到要更新的用户，删除临时文件
        remove("/jakl/img/UserData_temp.txt");
        return false;  // 更新失败
    }
}

/**
 * @brief 按钮删除事件回调函数，用于释放内存
 * @param e 事件对象指针
 * @note 当按钮被删除时，释放存储在user_data中的用户名字符串内存
 */
static void btn_delete_event_cb(lv_event_t * e)
{
    lv_event_code_t event_code = lv_event_get_code(e);  // 获取事件类型
    // 如果事件是删除事件
    if(event_code == LV_EVENT_DELETE) {
        // 获取存储在按钮中的用户名字符串
        char * username = (char *)lv_obj_get_user_data(e->target);
        // 如果用户名字符串存在，则释放内存
        if(username) {
            free(username);  // 释放内存
        }
    }
}

/**
 * @brief 加载用户列表函数
 * @note 从用户数据文件中读取所有用户信息，并在用户列表中显示
 *       每个用户显示为一个可点击的按钮，显示用户名和余额
 */
void load_user_list()
{
    // 如果用户列表对象不存在，直接返回
    if(!ui_UserList) return;

    // 清空列表：删除所有子对象
    lv_obj_t * child;
    while((child = lv_obj_get_child(ui_UserList, 0)) != NULL) {
        lv_obj_del(child);  // 删除子对象
    }

    // 以只读模式打开用户数据文件
    FILE * file = fopen("/jakl/img/UserData.txt", "r");
    if(file == NULL) {
        return;  // 文件打开失败，直接返回
    }

    char buffer[256];  // 存储文件中的一行数据
    
    // 跳过标题行
    if(fgets(buffer, sizeof(buffer), file) == NULL) {
        fclose(file);
        return;
    }

    // 逐行读取文件内容
    while(fgets(buffer, sizeof(buffer), file)) {
        // 跳过空行和注释行（以#开头的行）
        if(buffer[0] == '\n' || buffer[0] == '#') continue;

        char username[50], password[50];  // 存储用户名和密码
        int quota;                        // 存储用户余额
        
        // 解析每行数据：用户名 密码 余额
        if(sscanf(buffer, "%s %s %d", username, password, &quota) == 3) {
            // 格式化列表项文本：用户名 - 余额: XXX
            char item_text[100];
            snprintf(item_text, sizeof(item_text), "%s - 余额: %d", username, quota);

            // 创建列表项按钮
            lv_obj_t * btn = lv_btn_create(ui_UserList);
            lv_obj_set_size(btn, lv_pct(100), 40);  // 设置按钮大小（宽度100%，高度40像素）
            lv_obj_set_style_bg_color(btn, lv_color_hex(0xE6F3FF), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色

            // 创建按钮标签
            lv_obj_t * label = lv_label_create(btn);
            lv_label_set_text(label, item_text);  // 设置标签文本
            lv_obj_center(label);                 // 居中显示标签

            // 应用中文字体样式
            lv_style_t * fontStyle = AdminFontStyleInit();
            lv_obj_add_style(label, fontStyle, 0);

            // 修改字体颜色为深灰色
            lv_obj_set_style_text_color(label, lv_color_hex(0x6C757D), 0);

            // 为每个用户按钮添加点击事件和删除事件
            lv_obj_set_user_data(btn, strdup(username));  // 存储用户名（使用strdup复制字符串）
            lv_obj_add_event_cb(btn, user_item_clicked, LV_EVENT_CLICKED, NULL);     // 添加点击事件
            lv_obj_add_event_cb(btn, btn_delete_event_cb, LV_EVENT_DELETE, NULL);    // 添加删除事件（用于释放内存）
        }
    }
    fclose(file);  // 关闭文件
}

// ============= 键盘事件处理函数 =============
/**
 * @brief 修改用户文本框键盘事件处理函数
 * @param e 事件对象指针
 * @note 当文本框获得焦点时显示键盘，失去焦点时隐藏键盘
 */
static void modify_user_ta_event_cb(lv_event_t * e)
{
    lv_event_code_t event_code = lv_event_get_code(e);  // 获取事件类型
    lv_obj_t * ta              = lv_event_get_target(e);  // 获取文本框对象
    lv_obj_t * mbox            = lv_obj_get_parent(lv_obj_get_parent(ta));  // 获取消息框对象
    lv_obj_t * kb              = lv_obj_get_child(mbox, -1);                // 获取键盘对象

    // 当文本框获得焦点时
    if(event_code == LV_EVENT_FOCUSED) {
        // 如果键盘不存在则创建
        if(!kb || !lv_obj_check_type(kb, &lv_keyboard_class)) {
            kb = lv_keyboard_create(mbox);      // 创建键盘对象
            lv_obj_set_size(kb, lv_pct(90), 170);  // 设置键盘大小
            lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0);  // 对齐到底部中间
        }
        lv_keyboard_set_textarea(kb, ta);       // 将键盘关联到文本框
        lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);  // 显示键盘
    }

    // 当文本框失去焦点时
    if(event_code == LV_EVENT_DEFOCUSED) {
        // 如果键盘存在且类型正确，则隐藏键盘
        if(kb && lv_obj_check_type(kb, &lv_keyboard_class)) {
            lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);  // 隐藏键盘
        }
    }
}

/**
 * @brief 用户列表项点击事件处理函数
 * @param e 事件对象指针
 * @note 当点击用户列表中的某个用户时，显示修改用户信息的对话框
 *       管理员账户不允许修改
 */
void user_item_clicked(lv_event_t * e)
{
    lv_obj_t * btn  = lv_event_get_target(e);  // 获取被点击的按钮对象
    char * username = (char *)lv_obj_get_user_data(btn);  // 获取存储在按钮中的用户名

    // 检查是否为管理员账户
    if(strcmp(username, "admin") == 0) {
        // 创建提示消息框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "提示", "管理员账户不能修改！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
        return;  // 管理员账户不允许修改，直接返回
    }

    // 获取当前用户信息
    char current_password[50];  // 存储当前密码
    int current_quota;          // 存储当前余额
    if(!get_user_info(username, current_password, &current_quota)) {
        // 获取用户信息失败，显示错误提示
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "获取用户信息失败！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
        return;  // 获取信息失败，直接返回
    }

    // 创建修改用户信息的对话框
    lv_style_t * fontStyle = AdminFontStyleInit();
    lv_obj_t * modify_mbox = lv_msgbox_create(NULL, "修改用户信息", "请输入新的用户信息", NULL, true);
    lv_obj_set_size(modify_mbox, 450, 400);  // 设置对话框大小
    lv_obj_align(modify_mbox, LV_ALIGN_CENTER, 0, 0);  // 居中显示
    lv_obj_add_style(modify_mbox, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
    
    // 设置关闭按钮的字体样式
    lv_obj_t * btn_close         = lv_msgbox_get_close_btn(modify_mbox);
    lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
    lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);

    // 用户名显示标签（不可编辑，仅显示）
    lv_obj_t * user_label = lv_label_create(modify_mbox);
    lv_label_set_text_fmt(user_label, "用户名: %s", username);  // 格式化显示用户名
    lv_obj_set_width(user_label, lv_pct(100));  // 设置宽度为100%
    lv_obj_align(user_label, LV_ALIGN_TOP_MID, 0, 20);  // 对齐到顶部中间
    lv_obj_add_style(user_label, fontStyle, 0);  // 应用中文字体样式

    // 密码输入框
    lv_obj_t * pwd_ta = lv_textarea_create(modify_mbox);
    lv_obj_set_size(pwd_ta, 350, 50);  // 设置输入框大小
    lv_obj_align(pwd_ta, LV_ALIGN_TOP_MID, 0, 70);  // 对齐到顶部中间
    lv_textarea_set_placeholder_text(pwd_ta, "新密码");  // 设置占位符文本
    lv_textarea_set_text(pwd_ta, current_password);  // 显示当前密码
    lv_textarea_set_one_line(pwd_ta, true);          // 设置为单行输入
    lv_textarea_set_password_mode(pwd_ta, false);     // 禁用密码模式（显示明文）
    lv_obj_add_style(pwd_ta, fontStyle, 0);          // 应用中文字体样式
    // 添加键盘事件处理
    lv_obj_add_event_cb(pwd_ta, modify_user_ta_event_cb, LV_EVENT_ALL, NULL);

    // 余额输入框
    lv_obj_t * quota_ta = lv_textarea_create(modify_mbox);
    lv_obj_set_size(quota_ta, 350, 50);  // 设置输入框大小
    lv_obj_align(quota_ta, LV_ALIGN_TOP_MID, 0, 140);  // 对齐到顶部中间
    lv_textarea_set_placeholder_text(quota_ta, "新余额");  // 设置占位符文本
    char quota_str[20];
    snprintf(quota_str, sizeof(quota_str), "%d", current_quota);  // 将余额转换为字符串
    lv_textarea_set_text(quota_ta, quota_str);  // 显示当前余额
    lv_textarea_set_one_line(quota_ta, true);   // 设置为单行输入
    lv_obj_add_style(quota_ta, fontStyle, 0);   // 应用中文字体样式
    // 添加键盘事件处理
    lv_obj_add_event_cb(quota_ta, modify_user_ta_event_cb, LV_EVENT_ALL, NULL);

    // 确认修改按钮容器 - 使用弹性布局确保居中
    lv_obj_t * btn_container = lv_obj_create(modify_mbox);
    lv_obj_set_size(btn_container, lv_pct(100), 60);  // 设置容器大小
    lv_obj_align(btn_container, LV_ALIGN_BOTTOM_MID, 0, -10);  // 对齐到底部中间
    lv_obj_set_flex_flow(btn_container, LV_FLEX_FLOW_ROW);  // 设置弹性布局为行方向
    lv_obj_set_flex_align(btn_container, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);  // 设置对齐方式
    lv_obj_clear_flag(btn_container, LV_OBJ_FLAG_SCROLLABLE);  // 禁用滚动
    lv_obj_set_style_bg_opa(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景透明
    // 添加边框透明设置
    lv_obj_set_style_border_width(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置边框宽度为0
    lv_obj_set_style_outline_width(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置轮廓宽度为0

    // 确认修改按钮
    lv_obj_t * btn_modify_confirm = lv_btn_create(btn_container);
    lv_obj_set_size(btn_modify_confirm, 140, 50);  // 设置按钮大小
    lv_obj_set_style_bg_color(btn_modify_confirm, lv_color_hex(0xFFD700), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色（金色）
    lv_obj_t * label_modify_confirm = lv_label_create(btn_modify_confirm);
    lv_label_set_text(label_modify_confirm, "确认修改");  // 设置按钮文本
    lv_obj_center(label_modify_confirm);  // 居中显示标签
    lv_obj_add_style(label_modify_confirm, fontStyle, 0);  // 应用中文字体样式

    // 为确认按钮添加事件
    // 使用strdup复制用户名，确保在final_confirm_modify中仍然有效
    char * username_copy = strdup(username);  // 复制用户名字符串
    lv_obj_set_user_data(btn_modify_confirm, username_copy);  // 存储用户名
    lv_obj_set_user_data(lv_obj_get_parent(btn_modify_confirm), pwd_ta);      // 存储密码输入框
    lv_obj_set_user_data(lv_obj_get_parent(lv_obj_get_parent(btn_modify_confirm)), quota_ta);  // 存储余额输入框
    lv_obj_add_event_cb(btn_modify_confirm, final_confirm_modify, LV_EVENT_CLICKED, modify_mbox);  // 添加点击事件

    // 为消息框添加关闭事件，隐藏键盘
    lv_obj_add_event_cb(modify_mbox, modify_mbox_event_cb, LV_EVENT_DELETE, NULL);
}

/**
 * @brief 自动关闭消息框的定时器回调函数
 * @param timer 定时器对象指针
 * @note 用于在指定时间后自动关闭消息框
 */
static void auto_close_msgbox(lv_timer_t * timer)
{
    lv_obj_t * msgbox = (lv_obj_t *)timer->user_data;  // 获取消息框对象
    // 如果消息框存在且有效，则删除它
    if(msgbox && lv_obj_is_valid(msgbox)) {
        lv_obj_del(msgbox);  // 删除消息框
    }
    lv_timer_del(timer);  // 删除定时器
}

/**
 * @brief 焦点定时器回调函数
 * @param timer 定时器对象指针
 * @note 用于延迟设置文本框焦点，确保事件处理完成
 */
static void focus_timer_cb(lv_timer_t * timer)
{
    lv_obj_t * user_ta = (lv_obj_t *)timer->user_data;  // 获取文本框对象
    lv_event_send(user_ta, LV_EVENT_FOCUSED, NULL);     // 发送获得焦点事件
    lv_timer_del(timer);  // 删除定时器
}

/**
 * @brief 最终确认修改用户信息的回调函数
 * @param e 事件对象指针
 * @note 处理用户信息的最终修改确认，验证输入并更新用户数据文件
 *       修改成功后不关闭对话框，方便继续修改
 */
static void final_confirm_modify(lv_event_t * e)
{
    lv_obj_t * btn      = lv_event_get_target(e);  // 获取按钮对象
    char * username     = (char *)lv_obj_get_user_data(btn);  // 获取用户名
    lv_obj_t * pwd_ta   = lv_obj_get_user_data(lv_obj_get_parent(btn));  // 获取密码输入框
    lv_obj_t * quota_ta = lv_obj_get_user_data(lv_obj_get_parent(lv_obj_get_parent(btn)));  // 获取余额输入框

    // 获取用户输入的新密码和新余额
    const char * new_password  = lv_textarea_get_text(pwd_ta);   // 获取新密码
    const char * new_quota_str = lv_textarea_get_text(quota_ta); // 获取新余额（字符串形式）

    // 检查输入是否完整
    if(strlen(new_password) == 0 || strlen(new_quota_str) == 0) {
        // 创建错误提示消息框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "请填写完整信息！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
        
        // 释放内存
        free(username);
        return;  // 输入不完整，退出函数
    }

    // 将余额字符串转换为整数
    int new_quota = atoi(new_quota_str);

    // 更新用户信息
    if(update_user_info(username, new_password, new_quota)) {
        // 显示成功提示但不关闭修改对话框

        // 创建成功提示消息框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "成功", "用户信息修改成功！\n可以继续修改", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式

        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);

        // 添加自动关闭功能（只关闭提示，不关闭修改对话框）
        lv_timer_t * timer = lv_timer_create(auto_close_msgbox, 1500, tip);  // 1.5秒后关闭提示
        lv_timer_set_repeat_count(timer, 1);

        // 刷新用户列表（在后台更新）
        load_user_list();
    } else {
        // 更新失败，显示错误提示
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "用户信息修改失败！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
    }

    // 释放内存
    free(username);

    // 注意：移除了关闭对话框的代码 lv_obj_del(mbox);
    // 现在修改对话框会保持打开，用户可以继续修改
}

/**
 * @brief 添加用户文本框键盘事件处理函数
 * @param e 事件对象指针
 * @note 当文本框获得焦点时显示键盘，失去焦点时隐藏键盘
 */
static void add_user_ta_event_cb(lv_event_t * e)
{
    lv_event_code_t event_code = lv_event_get_code(e);  // 获取事件类型
    lv_obj_t * ta              = lv_event_get_target(e);  // 获取文本框对象
    lv_obj_t * mbox            = lv_obj_get_parent(lv_obj_get_parent(ta));  // 获取消息框对象
    lv_obj_t * kb              = lv_obj_get_child(mbox, -1);                // 获取键盘对象

    // 当文本框获得焦点时
    if(event_code == LV_EVENT_FOCUSED) {
        // 如果键盘不存在则创建
        if(!kb || !lv_obj_check_type(kb, &lv_keyboard_class)) {
            kb = lv_keyboard_create(mbox);      // 创建键盘对象
            lv_obj_set_size(kb, lv_pct(90), 170);  // 设置键盘大小
            lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0);  // 对齐到底部中间
        }
        lv_keyboard_set_textarea(kb, ta);       // 将键盘关联到文本框
        lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);  // 显示键盘
    }

    // 当文本框失去焦点时
    if(event_code == LV_EVENT_DEFOCUSED) {
        // 如果键盘存在且类型正确，则隐藏键盘
        if(kb && lv_obj_check_type(kb, &lv_keyboard_class)) {
            lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);  // 隐藏键盘
        }
    }
}

/**
 * @brief 添加用户按钮事件处理函数
 * @param e 事件对象指针
 * @note 点击添加用户按钮时，显示添加用户的对话框，包含用户名、密码、余额输入框
 */
void ui_event_ButtonAddUser(lv_event_t * e)
{
    // 初始化中文字体格式
    lv_style_t * fontStyle = AdminFontStyleInit();

    // 创建添加用户的对话框
    lv_obj_t * mbox = lv_msgbox_create(NULL, "添加用户", "请输入新用户信息", NULL, true);
    lv_obj_set_size(mbox, 450, 400);  // 设置对话框大小
    lv_obj_align(mbox, LV_ALIGN_CENTER, 0, 0);  // 居中显示
    lv_obj_add_style(mbox, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
    
    // 设置关闭按钮的字体样式
    lv_obj_t * btn_close         = lv_msgbox_get_close_btn(mbox);
    lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
    lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);

    // ============= 创建输入框 =============
    // 用户名输入框
    lv_obj_t * user_ta = lv_textarea_create(mbox);
    lv_obj_set_size(user_ta, 350, 50);  // 设置输入框大小
    lv_obj_align(user_ta, LV_ALIGN_TOP_MID, 0, 30);  // 对齐到顶部中间
    lv_textarea_set_placeholder_text(user_ta, "用户名");  // 设置占位符文本
    lv_textarea_set_one_line(user_ta, true);  // 设置为单行输入
    lv_obj_add_style(user_ta, fontStyle, 0);  // 应用中文字体样式
    lv_obj_add_event_cb(user_ta, add_user_ta_event_cb, LV_EVENT_ALL, NULL);  // 添加键盘事件处理

    // 密码输入框
    lv_obj_t * pwd_ta = lv_textarea_create(mbox);
    lv_obj_set_size(pwd_ta, 350, 50);  // 设置输入框大小
    lv_obj_align(pwd_ta, LV_ALIGN_TOP_MID, 0, 100);  // 对齐到顶部中间
    lv_textarea_set_placeholder_text(pwd_ta, "密码");  // 设置占位符文本
    lv_textarea_set_one_line(pwd_ta, true);  // 设置为单行输入
    lv_textarea_set_password_mode(pwd_ta, false);  // 禁用密码模式（显示明文）
    lv_obj_add_style(pwd_ta, fontStyle, 0);  // 应用中文字体样式
    lv_obj_add_event_cb(pwd_ta, add_user_ta_event_cb, LV_EVENT_ALL, NULL);  // 添加键盘事件处理

    // 余额输入框
    lv_obj_t * quota_ta = lv_textarea_create(mbox);
    lv_obj_set_size(quota_ta, 350, 50);  // 设置输入框大小
    lv_obj_align(quota_ta, LV_ALIGN_TOP_MID, 0, 170);  // 对齐到顶部中间
    lv_textarea_set_placeholder_text(quota_ta, "余额");  // 设置占位符文本
    lv_textarea_set_one_line(quota_ta, true);  // 设置为单行输入
    lv_obj_add_style(quota_ta, fontStyle, 0);  // 应用中文字体样式
    lv_obj_add_event_cb(quota_ta, add_user_ta_event_cb, LV_EVENT_ALL, NULL);  // 添加键盘事件处理

    // ============= 创建确认按钮容器 =============
    // 确认按钮容器 - 使用弹性布局确保居中
    lv_obj_t * btn_container = lv_obj_create(mbox);
    lv_obj_set_size(btn_container, lv_pct(100), 60);  // 设置容器大小
    lv_obj_align(btn_container, LV_ALIGN_BOTTOM_MID, 0, -10);  // 对齐到底部中间
    lv_obj_set_flex_flow(btn_container, LV_FLEX_FLOW_ROW);  // 设置弹性布局为行方向
    lv_obj_set_flex_align(btn_container, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);  // 设置对齐方式
    lv_obj_clear_flag(btn_container, LV_OBJ_FLAG_SCROLLABLE);  // 禁用滚动
    lv_obj_set_style_bg_opa(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景透明
    // 添加边框透明设置
    lv_obj_set_style_border_width(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置边框宽度为0
    lv_obj_set_style_outline_width(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置轮廓宽度为0

    // 确认按钮
    lv_obj_t * btn_confirm = lv_btn_create(btn_container);
    lv_obj_set_size(btn_confirm, 120, 50);  // 设置按钮大小
    lv_obj_set_style_bg_color(btn_confirm, lv_color_hex(0x90EE90), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色（浅绿色）
    lv_obj_t * label_confirm = lv_label_create(btn_confirm);
    lv_label_set_text(label_confirm, "确认");  // 设置按钮文本
    lv_obj_center(label_confirm);  // 居中显示标签
    lv_obj_add_style(label_confirm, fontStyle, 0);  // 应用中文字体样式

    // 为确认按钮添加事件
    // 使用user_data存储输入框对象，方便在confirm_add_user函数中访问
    lv_obj_set_user_data(btn_confirm, user_ta);  // 存储用户名输入框
    lv_obj_set_user_data(lv_obj_get_parent(btn_confirm), pwd_ta);  // 存储密码输入框
    lv_obj_set_user_data(lv_obj_get_parent(lv_obj_get_parent(btn_confirm)), quota_ta);  // 存储余额输入框
    lv_obj_add_event_cb(btn_confirm, confirm_add_user, LV_EVENT_CLICKED, mbox);  // 添加点击事件

    // 为消息框添加关闭事件，隐藏键盘
    lv_obj_add_event_cb(mbox, add_mbox_event_cb, LV_EVENT_DELETE, NULL);
}

/**
 * @brief 确认添加用户的回调函数
 * @param e 事件对象指针
 * @note 处理用户添加逻辑：
 *       1. 验证输入是否完整
 *       2. 检查用户名是否已存在
 *       3. 将用户信息写入文件
 *       4. 添加成功后清空输入框，方便继续添加
 */
void confirm_add_user(lv_event_t * e)
{
    lv_obj_t * btn = lv_event_get_target(e);  // 获取按钮对象

    // 从按钮的user_data中获取输入框对象
    lv_obj_t * user_ta  = lv_obj_get_user_data(btn);  // 获取用户名输入框
    lv_obj_t * pwd_ta   = lv_obj_get_user_data(lv_obj_get_parent(btn));  // 获取密码输入框
    lv_obj_t * quota_ta = lv_obj_get_user_data(lv_obj_get_parent(lv_obj_get_parent(btn)));  // 获取余额输入框

    // 获取用户输入的内容
    const char * username  = lv_textarea_get_text(user_ta);   // 获取用户名
    const char * password  = lv_textarea_get_text(pwd_ta);    // 获取密码
    const char * quota_str = lv_textarea_get_text(quota_ta);  // 获取余额（字符串形式）

    // 检查输入是否完整
    if(strlen(username) == 0 || strlen(password) == 0 || strlen(quota_str) == 0) {
        // 创建错误提示消息框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "请填写完整信息！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
        return;  // 输入不完整，退出函数
    }

    // 将余额字符串转换为整数
    int quota = atoi(quota_str);

    // 检查用户名是否已存在
    if(is_username_exists_admin(username, "/jakl/img/UserData.txt")) {
        // 创建错误提示消息框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "用户名已存在！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
        return;  // 用户名已存在，退出函数
    }

    // 以追加模式打开用户数据文件，添加用户
    FILE * file = fopen("/jakl/img/UserData.txt", "a");
    if(file) {
        // 将用户信息写入文件：用户名 密码 余额
        fprintf(file, "%s %s %d\n", username, password, quota);
        fclose(file);  // 关闭文件

        // 清空输入框内容，方便继续添加
        lv_textarea_set_text(user_ta, "");
        lv_textarea_set_text(pwd_ta, "");
        lv_textarea_set_text(quota_ta, "");

        // 先失去焦点再重新获取焦点，确保键盘事件正确绑定
        lv_event_send(user_ta, LV_EVENT_DEFOCUSED, NULL);

        // 延迟一小段时间后重新设置焦点，确保事件处理完成
        lv_timer_create(focus_timer_cb, 50, user_ta);

        // 显示成功提示但不关闭对话框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "成功", "用户添加成功！\n可以继续添加用户", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);

        // 添加自动关闭功能（只关闭提示，不关闭添加对话框）
        lv_timer_t * timer = lv_timer_create(auto_close_msgbox, 1500, tip);  // 1.5秒后关闭提示
        lv_timer_set_repeat_count(timer, 1);

        // 刷新用户列表（在后台更新，不影响当前对话框）
        load_user_list();
    } else {
        // 文件打开失败，显示错误提示
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "文件打开失败！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
    }
}

/**
 * @brief 删除用户文本框键盘事件处理函数
 * @param e 事件对象指针
 * @note 当文本框获得焦点时显示键盘，失去焦点时隐藏键盘
 */
static void delete_user_ta_event_cb(lv_event_t * e)
{
    lv_event_code_t event_code = lv_event_get_code(e);  // 获取事件类型
    lv_obj_t * ta              = lv_event_get_target(e);  // 获取文本框对象
    lv_obj_t * mbox            = lv_obj_get_parent(lv_obj_get_parent(ta));  // 获取消息框对象
    lv_obj_t * kb              = lv_obj_get_child(mbox, -1);                // 获取键盘对象

    // 当文本框获得焦点时
    if(event_code == LV_EVENT_FOCUSED) {
        // 如果键盘不存在则创建
        if(!kb || !lv_obj_check_type(kb, &lv_keyboard_class)) {
            kb = lv_keyboard_create(mbox);      // 创建键盘对象
            lv_obj_set_size(kb, lv_pct(90), 170);  // 设置键盘大小
            lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0);  // 对齐到底部中间
        }
        lv_keyboard_set_textarea(kb, ta);       // 将键盘关联到文本框
        lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);  // 显示键盘
    }

    // 当文本框失去焦点时
    if(event_code == LV_EVENT_DEFOCUSED) {
        // 如果键盘存在且类型正确，则隐藏键盘
        if(kb && lv_obj_check_type(kb, &lv_keyboard_class)) {
            lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);  // 隐藏键盘
        }
    }
}

/**
 * @brief 删除用户按钮事件处理函数
 * @param e 事件对象指针
 * @note 点击删除用户按钮时，显示删除用户的对话框，包含用户名输入框
 */
void ui_event_ButtonDeleteUser(lv_event_t * e)
{
    // 初始化中文字体格式
    lv_style_t * fontStyle = AdminFontStyleInit();

    // 创建删除用户的对话框
    lv_obj_t * mbox = lv_msgbox_create(NULL, "删除用户", "请输入要删除的用户名", NULL, true);
    lv_obj_set_size(mbox, 450, 300);  // 设置对话框大小
    lv_obj_align(mbox, LV_ALIGN_CENTER, 0, 0);  // 居中显示
    lv_obj_add_style(mbox, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
    
    // 设置关闭按钮的字体样式
    lv_obj_t * btn_close         = lv_msgbox_get_close_btn(mbox);
    lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
    lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);

    // 创建用户名输入框
    lv_obj_t * user_ta = lv_textarea_create(mbox);
    lv_obj_set_size(user_ta, 350, 50);  // 设置输入框大小
    lv_obj_align(user_ta, LV_ALIGN_TOP_MID, 0, 50);  // 对齐到顶部中间
    lv_textarea_set_placeholder_text(user_ta, "用户名");  // 设置占位符文本
    lv_textarea_set_one_line(user_ta, true);  // 设置为单行输入
    lv_obj_add_style(user_ta, fontStyle, 0);  // 应用中文字体样式

    // 为文本框添加键盘事件处理
    lv_obj_add_event_cb(user_ta, delete_user_ta_event_cb, LV_EVENT_ALL, NULL);

    // ============= 创建确认删除按钮容器 =============
    // 确认删除按钮容器 - 使用弹性布局确保居中
    lv_obj_t * btn_container = lv_obj_create(mbox);
    lv_obj_set_size(btn_container, lv_pct(100), 60);  // 设置容器大小
    lv_obj_align(btn_container, LV_ALIGN_BOTTOM_MID, 0, -10);  // 对齐到底部中间
    lv_obj_set_flex_flow(btn_container, LV_FLEX_FLOW_ROW);  // 设置弹性布局为行方向
    lv_obj_set_flex_align(btn_container, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);  // 设置对齐方式
    lv_obj_clear_flag(btn_container, LV_OBJ_FLAG_SCROLLABLE);  // 禁用滚动
    lv_obj_set_style_bg_opa(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景透明
    // 添加边框透明设置
    lv_obj_set_style_border_width(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置边框宽度为0
    lv_obj_set_style_outline_width(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置轮廓宽度为0

    // 确认删除按钮
    lv_obj_t * btn_confirm = lv_btn_create(btn_container);
    lv_obj_set_size(btn_confirm, 140, 50);  // 设置按钮大小
    lv_obj_set_style_bg_color(btn_confirm, lv_color_hex(0xFFB6C1), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色（浅粉色）
    lv_obj_t * label_confirm = lv_label_create(btn_confirm);
    lv_label_set_text(label_confirm, "确认删除");  // 设置按钮文本
    lv_obj_center(label_confirm);  // 居中显示标签
    lv_obj_add_style(label_confirm, fontStyle, 0);  // 应用中文字体样式

    // 为确认按钮添加点击事件，传递用户名输入框作为用户数据
    lv_obj_add_event_cb(btn_confirm, confirm_delete_user, LV_EVENT_CLICKED, user_ta);

    // 为消息框添加关闭事件，隐藏键盘
    lv_obj_add_event_cb(mbox, delete_mbox_event_cb, LV_EVENT_DELETE, NULL);
}

/**
 * @brief 确认删除用户的回调函数
 * @param e 事件对象指针
 * @note 处理用户删除逻辑：
 *       1. 验证输入是否为空
 *       2. 检查是否为管理员账户（不允许删除）
 *       3. 检查用户是否存在
 *       4. 从文件中删除用户
 *       5. 删除成功后清空输入框，方便继续删除
 */
void confirm_delete_user(lv_event_t * e)
{
    lv_obj_t * user_ta    = lv_event_get_user_data(e);  // 获取用户名输入框对象
    const char * username = lv_textarea_get_text(user_ta);  // 获取用户名

    // 检查用户名是否为空
    if(strlen(username) == 0) {
        // 创建错误提示消息框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "请输入用户名！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
        return;  // 用户名为空，退出函数
    }

    // 不能删除admin管理员账户
    if(strcmp(username, "admin") == 0) {
        // 创建错误提示消息框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "不能删除管理员账户！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
        return;  // 不能删除管理员账户，退出函数
    }

    // 检查用户是否存在
    if(!is_username_exists_admin(username, "/jakl/img/UserData.txt")) {
        // 创建错误提示消息框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "用户不存在！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
        return;  // 用户不存在，退出函数
    }

    // 从文件中删除用户（通过创建临时文件的方式）
    FILE * file      = fopen("/jakl/img/UserData.txt", "r");        // 以只读模式打开原文件
    FILE * temp_file = fopen("/jakl/img/UserData_temp.txt", "w");   // 以写入模式创建临时文件

    // 如果文件打开成功
    if(file && temp_file) {
        char buffer[256];  // 存储文件中的一行数据
        
        // 复制标题行到临时文件
        fgets(buffer, sizeof(buffer), file);
        fputs(buffer, temp_file);

        // 逐行读取文件内容
        while(fgets(buffer, sizeof(buffer), file)) {
            char file_username[50];
            // 解析每行的用户名
            if(sscanf(buffer, "%s", file_username) == 1) {
                // 如果不是要删除的用户，则复制到临时文件
                if(strcmp(username, file_username) != 0) {
                    fputs(buffer, temp_file);
                }
            }
        }

        fclose(file);      // 关闭原文件
        fclose(temp_file); // 关闭临时文件

        // 替换原文件
        remove("/jakl/img/UserData.txt");  // 删除原文件
        rename("/jakl/img/UserData_temp.txt", "/jakl/img/UserData.txt");  // 将临时文件重命名为原文件

        // 清空输入框内容，方便继续删除
        lv_textarea_set_text(user_ta, "");

        // 先失去焦点再重新获取焦点，确保键盘事件正确绑定
        lv_event_send(user_ta, LV_EVENT_DEFOCUSED, NULL);

        // 延迟一小段时间后重新设置焦点，确保事件处理完成
        lv_timer_create(focus_timer_cb, 50, user_ta);

        // 显示成功提示但不关闭对话框
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "成功", "用户删除成功！\n可以继续删除用户", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);

        // 添加自动关闭功能（只关闭提示，不关闭删除对话框）
        lv_timer_t * timer = lv_timer_create(auto_close_msgbox, 1500, tip);  // 1.5秒后关闭提示
        lv_timer_set_repeat_count(timer, 1);

        // 刷新用户列表（在后台更新，不影响当前对话框）
        load_user_list();
    } else {
        // 文件操作失败，显示错误提示
        lv_style_t * fontStyle = AdminFontStyleInit();
        lv_obj_t * tip         = lv_msgbox_create(NULL, "错误", "文件操作失败！", NULL, true);
        lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
        lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
        
        // 设置关闭按钮的字体样式
        lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
        lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
        lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
    }
}

/**
 * @brief 刷新按钮事件处理函数
 * @param e 事件对象指针
 * @note 点击刷新按钮时，重新加载用户列表并显示刷新成功提示
 */
void ui_event_ButtonRefresh(lv_event_t * e)
{
    // 重新加载用户列表
    load_user_list();

    // 创建刷新成功提示消息框
    lv_style_t * fontStyle = AdminFontStyleInit();
    lv_obj_t * tip         = lv_msgbox_create(NULL, "刷新", "用户列表已刷新！", NULL, true);
    lv_obj_align(tip, LV_ALIGN_CENTER, 0, 0);  // 居中显示
    lv_obj_add_style(tip, fontStyle, LV_PART_MAIN);  // 应用中文字体样式
    
    // 设置关闭按钮的字体样式
    lv_obj_t * btn_close         = lv_msgbox_get_close_btn(tip);
    lv_style_t * close_btn_style = create_builtin_font_style(&lv_font_montserrat_22);
    lv_obj_add_style(btn_close, close_btn_style, LV_PART_MAIN);
}

/**
 * @brief 返回登录按钮事件处理函数
 * @param e 事件对象指针
 * @note 点击返回登录按钮时，切换回登录界面
 */
void ui_event_ButtonBackToLogin(lv_event_t * e)
{
    lv_event_code_t event_code = lv_event_get_code(e);  // 获取事件类型
    if(event_code == LV_EVENT_CLICKED) {
        // 直接切换到登录屏幕，不手动销毁当前屏幕
        _ui_screen_change(&ui_LoginForm, LV_SCR_LOAD_ANIM_FADE_OUT, 10, 0, &ui_LoginForm_screen_init);
    }
}

// ============= UI构建函数 =============
/**
 * @brief 管理员面板屏幕初始化函数
 * @note 创建并初始化管理员界面的所有UI组件，包括：
 *       - 标题标签
 *       - 用户列表容器
 *       - 操作按钮（添加用户、删除用户、刷新列表、返回登录）
 */
void ui_AdminPanel_screen_init(void)
{
    // 初始化中文字体格式
    lv_style_t * fontStyle = AdminFontStyleInit();

    // ============= 创建管理员面板主屏幕对象 =============
    ui_AdminPanel = lv_obj_create(NULL);  // 创建管理员面板对象
    lv_obj_clear_flag(ui_AdminPanel, LV_OBJ_FLAG_SCROLLABLE);  // 禁用滚动

    // 设置淡蓝色背景
    lv_obj_set_style_bg_color(ui_AdminPanel, lv_color_hex(0xE6F3FF), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色
    lv_obj_set_style_bg_opa(ui_AdminPanel, 255, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景不透明

    // ============= 创建标题标签 =============
    lv_obj_t * title = lv_label_create(ui_AdminPanel);
    lv_label_set_text(title, "管理员用户管理");  // 设置标题文本
    lv_obj_add_style(title, fontStyle, 0);  // 应用中文字体样式
    lv_obj_set_style_text_color(title, lv_color_hex(0x0066CC), 0);  // 设置文本颜色（深蓝色）
    lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 20);  // 对齐到顶部中间

    // ============= 创建用户列表容器 =============
    ui_UserList = lv_obj_create(ui_AdminPanel);
    lv_obj_set_size(ui_UserList, 600, 300);  // 设置列表大小
    lv_obj_align(ui_UserList, LV_ALIGN_TOP_MID, 0, 60);  // 对齐到顶部中间
    lv_obj_set_flex_flow(ui_UserList, LV_FLEX_FLOW_COLUMN);  // 设置弹性布局为列方向
    lv_obj_set_flex_align(ui_UserList, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);  // 设置对齐方式
    
    // 设置列表样式
    lv_obj_set_style_bg_color(ui_UserList, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色（白色）
    lv_obj_set_style_border_color(ui_UserList, lv_color_hex(0x87CEEB), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置边框颜色（天蓝色）
    lv_obj_set_style_border_width(ui_UserList, 2, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置边框宽度

    // ============= 创建按钮容器 =============
    // 按钮容器 - 使用弹性布局
    lv_obj_t * btn_container = lv_obj_create(ui_AdminPanel);
    lv_obj_set_size(btn_container, 650, 80);  // 设置容器大小
    lv_obj_align(btn_container, LV_ALIGN_BOTTOM_MID, 0, -20);  // 对齐到底部中间
    lv_obj_clear_flag(btn_container, LV_OBJ_FLAG_SCROLLABLE);  // 禁用滚动
    lv_obj_set_style_bg_opa(btn_container, 0, LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景透明

    // 设置弹性布局
    lv_obj_set_flex_flow(btn_container, LV_FLEX_FLOW_ROW);  // 设置弹性布局为行方向
    lv_obj_set_flex_align(btn_container, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);  // 设置对齐方式（均匀分布）

    // ============= 创建操作按钮 =============
    // 添加用户按钮
    ui_ButtonAddUser = lv_btn_create(btn_container);
    lv_obj_set_size(ui_ButtonAddUser, 120, 50);  // 设置按钮大小
    lv_obj_set_style_bg_color(ui_ButtonAddUser, lv_color_hex(0x90EE90), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色（浅绿色）
    lv_obj_t * label_add = lv_label_create(ui_ButtonAddUser);
    lv_label_set_text(label_add, "添加用户");  // 设置按钮文本
    lv_obj_center(label_add);  // 居中显示标签
    lv_obj_add_style(label_add, fontStyle, 0);  // 应用中文字体样式

    // 删除用户按钮
    ui_ButtonDeleteUser = lv_btn_create(btn_container);
    lv_obj_set_size(ui_ButtonDeleteUser, 120, 50);  // 设置按钮大小
    lv_obj_set_style_bg_color(ui_ButtonDeleteUser, lv_color_hex(0xFFB6C1), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色（浅粉色）
    lv_obj_t * label_del = lv_label_create(ui_ButtonDeleteUser);
    lv_label_set_text(label_del, "删除用户");  // 设置按钮文本
    lv_obj_center(label_del);  // 居中显示标签
    lv_obj_add_style(label_del, fontStyle, 0);  // 应用中文字体样式

    // 刷新列表按钮
    ui_ButtonRefresh = lv_btn_create(btn_container);
    lv_obj_set_size(ui_ButtonRefresh, 120, 50);  // 设置按钮大小
    lv_obj_set_style_bg_color(ui_ButtonRefresh, lv_color_hex(0x87CEEB), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色（天蓝色）
    lv_obj_t * label_refresh = lv_label_create(ui_ButtonRefresh);
    lv_label_set_text(label_refresh, "刷新列表");  // 设置按钮文本
    lv_obj_center(label_refresh);  // 居中显示标签
    lv_obj_add_style(label_refresh, fontStyle, 0);  // 应用中文字体样式

    // 返回登录按钮
    ui_ButtonBackToLogin = lv_btn_create(btn_container);
    lv_obj_set_size(ui_ButtonBackToLogin, 120, 50);  // 设置按钮大小
    lv_obj_set_style_bg_color(ui_ButtonBackToLogin, lv_color_hex(0xD3D3D3), LV_PART_MAIN | LV_STATE_DEFAULT);  // 设置背景色（浅灰色）
    lv_obj_t * label_back = lv_label_create(ui_ButtonBackToLogin);
    lv_label_set_text(label_back, "返回登录");  // 设置按钮文本
    lv_obj_center(label_back);  // 居中显示标签
    lv_obj_add_style(label_back, fontStyle, 0);  // 应用中文字体样式

    // ============= 添加事件处理 =============
    lv_obj_add_event_cb(ui_ButtonAddUser, ui_event_ButtonAddUser, LV_EVENT_CLICKED, NULL);  // 添加用户按钮点击事件
    lv_obj_add_event_cb(ui_ButtonDeleteUser, ui_event_ButtonDeleteUser, LV_EVENT_CLICKED, NULL);  // 删除用户按钮点击事件
    lv_obj_add_event_cb(ui_ButtonRefresh, ui_event_ButtonRefresh, LV_EVENT_CLICKED, NULL);  // 刷新按钮点击事件
    lv_obj_add_event_cb(ui_ButtonBackToLogin, ui_event_ButtonBackToLogin, LV_EVENT_CLICKED, NULL);  // 返回登录按钮点击事件

    // 加载用户列表
    load_user_list();
}

/**
 * @brief 管理员面板屏幕销毁函数
 * @note 将UI对象指针设置为NULL，防止野指针
 *       不在这里删除对象，让LVGL自动处理屏幕销毁
 */
void ui_AdminPanel_screen_destroy(void)
{
    // 将所有UI对象指针设置为NULL，防止野指针
    ui_AdminPanel        = NULL;
    ui_UserList          = NULL;
    ui_ButtonAddUser     = NULL;
    ui_ButtonDeleteUser  = NULL;
    ui_ButtonRefresh     = NULL;
    ui_ButtonBackToLogin = NULL;
}